package com.jielihaofeng.atguigu.dubborpc.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.concurrent.Callable;

/**
 * @author Johnnie Wind
 * @description 客户端处理器
 * @date 2021/11/24 17:33
 */
public class NettyClientHandler extends ChannelInboundHandlerAdapter implements Callable {

    // 上下文
    private ChannelHandlerContext context;
    // 返回的结果
    private String result;
    // 客户端调用方法时传入的参数
    private String para;

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 在其他方法用到当前handler的上下文所以要赋值
        context = ctx;
    }

    // notify 唤醒等待的线程
    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        result = (String) msg;
        notify();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }

    // 被代理对象调用，发送数据给服务器 -> wait -> 等待被唤醒（channelRead） -> 返回结果
    @Override
    public synchronized Object call() throws Exception {
        context.writeAndFlush(para);
        wait();
        return result;
    }

    void setPara(String para) {
        this.para = para;
    }
}
